package com.tanhua.server.service;

import com.alibaba.fastjson.JSON;
import com.tanhua.autoconfig.template.FaceTemplate;
import com.tanhua.autoconfig.template.HuanXinTemplate;
import com.tanhua.autoconfig.template.OssTemplate;
import com.tanhua.commons.exception.TanHuaException;
import com.tanhua.dubbo.api.db.UserInfoApi;
import com.tanhua.dubbo.api.mongo.FriendApi;
import com.tanhua.dubbo.api.mongo.UserLikeApi;
import com.tanhua.model.db.User;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.mongo.Friend;
import com.tanhua.model.mongo.RecommendUser;
import com.tanhua.model.vo.*;
import com.tanhua.server.interceptor.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.joda.time.DateTime;
import org.joda.time.Years;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用户注册-完善个人（保存用户信息、上传头像）-业务实现类
 */
@Service
@Slf4j
public class UserInfoService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @DubboReference
    private UserInfoApi userInfoApi;

    @Autowired
    private FaceTemplate faceTemplate;

    @Autowired
    private OssTemplate ossTemplate;

    @Autowired
    private HuanXinTemplate huanXinTemplate;

    @DubboReference
    private UserLikeApi userLikeApi;

    @DubboReference
    private FriendApi friendApi;

    /**
     * 第二步：用户注册：保存用户信息
     * @param userInfoVo
     */
    public void loginReginfo(UserInfoVo userInfoVo) {
        //3.如果登录，则调用服务提供者 保存用户信息
        UserInfo userInfo = new UserInfo();
        //将相同属性 相同类型 的数据从一个对象 copy 另一个对象中
        BeanUtils.copyProperties(userInfoVo,userInfo);
        userInfo.setId(UserHolder.getUserId()); //当前登录用户id 跟 tb_userInfo表 一对一
        userInfo.setAge(getAge(userInfoVo.getBirthday()));//设置年龄
        userInfoApi.add(userInfo);
    }

    /**
     * 根据请求头中token获取user对象
     * @param token
     * @return
     */
    /*private User getLoginUserByToken(String token) {
        String tokenKey = "TOKEN_" + token;
        String userStr = stringRedisTemplate.opsForValue().get(tokenKey);
        //2.如果没有登录 抛出异常
        if(StringUtils.isEmpty(userStr)){
            throw new TanHuaException(ErrorResult.loginFail());
        }
        //2.1 根据userStr 转user对象 并获取用户id
        return JSON.parseObject(userStr, User.class);
    }*/


    /**
     * 通过年-月-日获取年龄
     * @param yearMonthDay
     * @return
     */
    private int getAge(String yearMonthDay){
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date birthDay = sdf.parse(yearMonthDay);
            Years years = Years.yearsBetween(new DateTime(birthDay), DateTime.now());
            return years.getYears();
        } catch (ParseException e) {
            log.error("获取用户年龄失败!", e);
            return 0;
        }
    }

    /**
     * 第三步：用户注册：上传头像
     */
    public void loginHeadReginfo(MultipartFile headPhoto) {
        try {
            //2.调用百度人脸识别
            boolean faceFlag = faceTemplate.detect(headPhoto.getBytes());
            if(!faceFlag){
                throw new TanHuaException(ErrorResult.faceError());
            }
            //3.调用阿里云oss
            String filename = headPhoto.getOriginalFilename();//原始文件名称
            String headUrl = ossTemplate.upload(filename, headPhoto.getInputStream()); //调用阿里云服务 返回头像地址
            //4.调用服务提供者 更新头像地址
            UserInfo userInfo = new UserInfo();
            userInfo.setId(UserHolder.getUserId());//当前用户id
            userInfo.setAvatar(headUrl);//头像地址
            userInfoApi.update(userInfo);
        } catch (IOException e) {
            e.printStackTrace();
            throw new TanHuaException(ErrorResult.error());
        }
    }

    /**
     * 用户信息管理-查询用户资料
     */
    public UserInfoVo getUserInfo(Long userID) {
        //1.获取userId
        Long userId = UserHolder.getUserId();
        //2.调用服务提供者 查询用户资料
        if(userID != null){
            userId = userID;
        }
        UserInfo userInfo = userInfoApi.getUserInfo(userId);
        //3.构造UserInfoVo返回
        UserInfoVo userInfoVo = new UserInfoVo();
        BeanUtils.copyProperties(userInfo,userInfoVo);
        userInfoVo.setId(userId);//设置用户id
        return userInfoVo;
    }

    /**
     * 用户信息管理-更新用户资料
     */
    public void updateUserInfo(UserInfoVo userInfoVo) {
        //2.调用服务提供者 更新用户资料
        UserInfo userInfo = new UserInfo();
        BeanUtils.copyProperties(userInfoVo,userInfo);
        userInfo.setId(UserHolder.getUserId());//设置当前用户id 需要根据id更新用户信息
        userInfo.setAge(getAge(userInfoVo.getBirthday()));
        userInfoApi.update(userInfo);
    }

    //互相喜欢，喜欢，粉丝 - 统计
    public CountsVo queryCounts() {
        Long userId = UserHolder.getUserId();
        //互相喜欢：调用服务查询好友表数量
        Long eachLoveCount = friendApi.count(userId);
        //喜欢：调用服务查询我的喜欢数量userId=xxx 查询likeUserId数量
        Long loveCount = userLikeApi.countByUserId(userId);
        //粉丝:调用服务查询我的喜欢数量likeUserId=xxx 查询userId数量
        Long fanCount = userLikeApi.countByLikeUserId(userId);
        CountsVo vo = new CountsVo();
        vo.setEachLoveCount(eachLoveCount);
        vo.setLoveCount(loveCount);
        vo.setFanCount(fanCount);
        return vo;
    }

    //粉丝-喜欢
    public void makeFriends(Long friendId) {
        Long userId = UserHolder.getUserId();
        //根据当前用户id 与 好友id 删除UserLike中 粉丝-喜欢记录
        userLikeApi.deleteById(userId,friendId);
        //往好友表tanhua_users表中保存2条记录
        Friend friend = new Friend();
        friend.setUserId(userId);
        friend.setFriendId(friendId);
        friendApi.saveFriend(friend);
        //调用环信交友方法
        huanXinTemplate.makeFriends(userId,friendId);
        log.debug("粉丝{}-喜欢{}成功了",friendId,userId);
    }

    //互相喜欢，喜欢，粉丝、谁看过我 - 分页查询
    public PageResult<FriendVo> queryFriendsByPage(int type, int page, int pagesize) {
        PageResult<FriendVo> voPageResult = new PageResult<>();

        Long userId = UserHolder.getUserId();//当前用户id
        PageResult<RecommendUser> pageResult = new PageResult<>();
        //根据不同的类型 分页查询数据
        switch (type){
            case 1:
                //互相喜欢
                pageResult = userLikeApi.findPageLikeEachOther(userId,page,pagesize);
                break;
            case 2:
                //我喜欢
                pageResult = userLikeApi.findPageOneSideLike(userId,page,pagesize);
                break;
            case 3:
                //粉丝
                pageResult = userLikeApi.findPageFens(userId,page,pagesize);
                break;
            case 4:
                //谁看过我
                pageResult = userLikeApi.findPageMyVisitors(userId,page,pagesize);
                break;
            default: break;
        }
        if(pageResult == null || CollectionUtils.isEmpty(pageResult.getItems())){
            return new PageResult<>(0l,10l,0l,1l,null);
        }
        //从分页对象中获取推荐用户数据 循环遍历查询用户信息
        List<FriendVo> friendVoList = new ArrayList<>();
        for (RecommendUser recommendUser : pageResult.getItems()) {
            FriendVo friendVo = new FriendVo();
            UserInfo userInfo = userInfoApi.queryUserInfo(recommendUser.getToUserId());//根据要展示的用户id作为条件查询
            BeanUtils.copyProperties(userInfo,friendVo);//展示的用户信息
            friendVo.setMatchRate(recommendUser.getScore().intValue());//缘分值（匹配度）
            friendVoList.add(friendVo);
        }
        //构造Vo返回
        BeanUtils.copyProperties(pageResult,voPageResult);
        voPageResult.setItems(friendVoList);
        return voPageResult;
    }

    //喜欢--取消
    public void disLike(Long friendId) {
        //获取当前用户id
        Long userId = UserHolder.getUserId();
        //当前用户id 与 好友id 删除UserLike中的记录
        userLikeApi.deleteById(userId,friendId);
        log.debug("我不再爱你了");
    }
}
